home *** CD-ROM | disk | FTP | other *** search
/ Spanish Scene 1 / SpanishScene1.iso / spanish pack n°1 by llfb / revistas / fanzine / fanzine10-1.dms / fanzine10-1.adf / EjemploVoz / EjemploVOZ.c < prev   
C/C++ Source or Header  |  1994-11-04  |  9KB  |  205 lines

  1. /* ----------------------------------------------------------------------- */
  2. /*     Programación 'Made in Amiga': Empleo general de dispositivos        */
  3. /*            Ejemplo VOZ (funciona como una aplicación CLI)               */
  4. /*                  por Dámaso D. Estévez (NOV-1994)                       */
  5. /*                  para la revista FANZINE en disco                       */
  6. /*                           Dominio Público                               */
  7. /*                                                                         */
  8. /*  REQUIERE  :  KickStart 2.0 o superior.                                 */
  9. /*  PROBADO EN:  Amiga 1200 (KickStart 3.0) estándar con HD y              */
  10. /*               Amiga 1200 (KickStart 1.3) estándar (je, je).        X-D  */
  11. /*                                                                         */
  12. /*  Compilado con DICE C versión no registrada 2.06.21 de Dominio Público  */
  13. /*  OPCIONES: -2.0 -v -f                                                   */
  14. /* ----------------------------------------------------------------------- */
  15.  
  16. /* ======================================================================= */
  17.  
  18. /* Ficheros estándar del C */
  19. /* ^^^^^^^^^^^^^^^^^^^^^^^ */
  20. #include <stdio.h>
  21. #include <string.h>
  22.  
  23. /* Ficheros propiedad de C= para Amiga */
  24. /* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
  25. #include <dos/dos.h>
  26. #include <exec/exec.h>
  27. #include <exec/types.h>
  28. #include <devices/narrator.h>
  29.  
  30. /*   CADENA DE VERSIÓN SEGÚN ESPECIFICACIONES DE C=    */
  31. /* a añadir  a todas tus  programas: suele contener el */
  32. /* nombre del programa,  la versión, fecha y el nombre */
  33. /* programador, al menos.                              */
  34. /* Ejecuta desde CLI el programa Version situado en C: */
  35. /* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
  36. const char Vers[]="$VER: VOZ 0.4 por D. Ðstévez para FANZINE (NOV-94)";
  37.  
  38. extern struct Library *SysBase;
  39.  
  40. /* ======================================================================= */
  41.  
  42. int main(void)
  43. {
  44.  
  45. int contador;
  46.  
  47. /* Valor distinto de cero indica error y su tipo */
  48. /*  Útil para ejecución y control desde scripts  */
  49. /* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
  50. UBYTE error = 0;
  51.  
  52. /* Estructuras para puertos y petición E/S (voz) */
  53. /* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
  54. struct MsgPort         *puerto1;
  55. struct narrator_rb     *voz;
  56.  
  57. /* Cadena fonemas a pronunciar: Fanzine, la mejor revista en disco para Amiga */
  58. /* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
  59. char   *fonemas="FAHNTHIH6N, LAH MEH/HOHR REHVIH3STAH EHN DIH3SKAO PAH1RAH AHMIH5GAH.";
  60.  
  61. /*       Definición de canales a emplear         */
  62. /*      BYTE canales[4]   = {3, 5, 10, 12};      */
  63. /*   Esta definición funcionará con SAS/Lattice, */
  64. /* pero no con DICE C (es el que yo empleo), así */
  65. /* que uso el siguiente método opcional ...      */
  66. /* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
  67. BYTE canales[4];
  68.      canales[0]=3;
  69.      canales[1]=5;
  70.      canales[2]=10;
  71.      canales[3]=12;
  72.  
  73. printf("\n");
  74. printf("Programa de ejemplo para FANZINE en disco - Dispositivos\n\n");
  75.  
  76.  
  77. /*  VERIFICO SI EL KICKSTART ES >= 2.0 AUNQUE ESPECIFIQUE EN LA  */
  78. /* DOCUMENTACIÓN LOS REQUERIMIENTOS  (¡LOS HAY MUY DESPISTADOS!) */
  79. /* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
  80. if(SysBase->lib_Version>=36) {
  81.  
  82.   if(puerto1=(struct MsgPort *) CreateMsgPort("EjemploVoz",0)) {
  83.     printf(" -Creado puerto 'EjemploVoz' con CreateMsgPort y");
  84.  
  85.     if(voz=(struct narrator_rb *) CreateIORequest(puerto1, sizeof(struct narrator_rb))) {
  86.       printf(" petición E/S con CreateIORequest.\n");
  87.  
  88.       /*   Activo las nuevas características bajo KickStart 2.0   */
  89.       /* del sintetizador de voz (perturbación, entusiasmo, etc). */
  90.       /* SIEMPRE ANTES DE EJECUTAR OpenDevice().                  */
  91.       /* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
  92.       voz->flags = NDF_NEWIORB;
  93.  
  94.       if(OpenDevice("narrator.device",0,(struct IORequest *)voz,0L)) {
  95.  
  96.         /* ADVERTENCIA:  En contra de lo habitual con otras funciones, */
  97.         /*              si OpenDevice() devuelve  un valor positivo es */
  98.         /*              que FRACASÓ.                                   */
  99.         /* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
  100.         printf("No he podido abrir 'narrator.device'.\nTerminando ...\n");
  101.  
  102.         }
  103.        else {
  104.  
  105.         printf(" -Acceso abierto con OpenDevice a 'narrator.device'.\n\n");
  106.  
  107.         /*    Para conocer todos los campos de la estructura, consulte */
  108.         /* el fichero translator.h (en includes/devices) y/o el 'Amiga */
  109.         /* ROM Kernel Reference Manual: Devices' en su capítulo 8.     */
  110.         /*    Los parámetros  los he probado con el programa  de Chris */
  111.         /* Demiris 'SpeechToy 2'.                                      */
  112.         /* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
  113.         voz->ch_masks           = &canales[0];
  114.         voz->nm_masks           = sizeof(canales);
  115.         voz->message.io_Command = CMD_WRITE;
  116.         voz->message.io_Data    = fonemas;
  117.         voz->message.io_Length  = strlen(fonemas);
  118.         voz->sex                = MALE;          /* Sexo voz: MALE, FEMALE */
  119.         voz->volume             = 50;                    /* Volumen (0-64) */
  120.         voz->rate               = 120;  /* Velocidad (40-400 palabras/min) */
  121.         voz->pitch              = 150;           /* Frec. base voz (65-320)*/
  122.         voz->mode               = NATURALF0;              /* Tipo de habla */
  123.         voz->F0perturb          = 50;        /* Perturbación formante cero */
  124.         voz->F0enthusiasm       = 64;          /* Entusiasmo formante cero */
  125.         voz->F1adj              = -4;           /* Ajuste primera formante */
  126.         voz->priority           = 50;                         /* Prioridad */
  127.  
  128.         /* Envío de la petición E/S al dispositivo */
  129.         /* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
  130.         printf(" -Envío de la petición síncrona con DoIO:\n  mientras 'habla' se congela el avance del programa.\n\n");
  131.         DoIO(voz);
  132.  
  133.         /* Cuenta hasta 3 (~3 segs.) Pero NO se ejecuta hasta */
  134.         /* que DoIO acabe de ejecutar la petición.            */
  135.         /* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
  136.         for(contador=1;contador<4;contador++) {
  137.            printf("     Contando hasta tres ... %d\n",contador);
  138.            Delay( 1 * 50 );                        /* Espera de un segundo */
  139.            }
  140.         printf("\n");
  141.  
  142.         voz->mode               = MANUALF0;
  143.         printf(" -Envío de la petición asíncrona con SendIO:\n  ahora mientras 'habla' NO se congela el avance del programa.\n\n");
  144.  
  145.         /* Envío de la misma petición E/S con la ÚNICA modificación */
  146.         /* del modo de habla ahora de forma asíncrona.              */
  147.         /* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
  148.         SendIO(voz);
  149.  
  150.         /* Cuenta hasta 3 (~3 segs.).  Se ejecuta mientras habla */
  151.         /* pues SendIO devuelve el control inmediatamente.       */
  152.         /* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
  153.         for(contador=1;contador<4;contador++) {
  154.            printf("     Contando hasta tres ... %d\n",contador);
  155.            Delay( 1 * 50 );
  156.            }
  157.         printf("\n");
  158.  
  159.  
  160.         /* Cancelamos la petición, si aún no se ha ejecutado completamente */
  161.         /*    (en las pruebas se corta el habla en la palabra 'disco')     */
  162.         /* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
  163.         printf(" -Comprobando petición con CheckIO y cancelándola si está pendiente con AbortIO.\n");
  164.         if(!(CheckIO(voz))) AbortIO(voz);
  165.         WaitIO(voz);
  166.  
  167.         printf(" -Cerrando con CloseDevice el dispositivo 'narrator.device'.\n");
  168.         CloseDevice((struct IORequest *)voz);
  169.         }
  170.  
  171.       printf(" -Borrando la petición E/S con DeleteIORequest y");
  172.       DeleteIORequest(voz);
  173.       }
  174.      else {
  175.       error = 3;
  176.       printf("No he podido crear la petición E/S.\nFIN.\n");
  177.       }
  178.     printf(" borrando el puerto con DeleteMsgPort.\n");
  179.     DeleteMsgPort(puerto1);
  180.     }
  181.    else {
  182.     error = 2;
  183.     printf("No he podido crear el puerto de mensajes.\nFIN.\n");
  184.     }
  185.  
  186.   }
  187.  else {
  188.   error = 1;
  189.   printf("\n¡Lo siento, necesito KickStart >= 2.0!. FIN.\n");
  190.   }
  191.  
  192. printf("\n");
  193. exit(error);
  194. };
  195.  
  196. /* ======================================================================= */
  197.  
  198. /*    Vuelca en papel el listado (160 caracteres/línea y Elite Condensada) */
  199. /* para poder leerlo con tranquilidad y sin quemar la vista.    He añadido */
  200. /* comentarios en el listado  como se puede ver, además de que el programa */
  201. /* informa sobre los pasos básicos que va dando en la gestión del disposi- */
  202. /* tivo.                                                                   */
  203.  
  204. /* ======================================================================= */
  205.